﻿using Medlcalcare.MVC.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace Medlcalcare.MVC.Controllers
{
    /// <summary>
    /// 智能客服API控制器
    /// 处理用户消息并返回AI回复
    /// </summary>
    [ApiController]
    [Route("api/chat")]
    [AllowAnonymous]
    public class ChatController : ControllerBase
    {
        // DeepSeek AI服务接口（用于获取AI回复）
        private readonly IDeepSeekService _deepSeek;
        // 聊天会话服务接口（用于管理会话状态）
        private readonly IChatSessionService _sessionService;
        /// <summary>
        /// 构造函数（依赖注入）
        /// </summary>
        /// <param name="deepSeek">DeepSeek AI服务实例</param>
        /// <param name="sessionService">会话服务实例</param>
        public ChatController(
            IDeepSeekService deepSeek,
            IChatSessionService sessionService)
        {
            _deepSeek = deepSeek;
            _sessionService = sessionService;
        }
        /// <summary>
        /// 处理用户消息并返回AI回复
        /// </summary>
        /// <param name="request">聊天请求，包含SessionId和用户消息</param>
        /// <returns>包含AI回复的响应</returns>
        [HttpPost("send")]
        public async Task<IActionResult> SendMessage([FromBody] ChatRequest request)
        {
            // 1. 获取或创建聊天会话
            // - 如果SessionId存在则获取现有会话
            // - 不存在则创建新会话
            var session = _sessionService.GetOrCreateSession(request.SessionId);

            // 2. 获取最近的5条聊天记录作为上下文
            // - 帮助AI理解当前对话语境
            var context = session.GetRecentMessages(5);

            // 3. 调用DeepSeek AI服务获取回复
            // - 传入会话ID、用户消息和历史上下文
            var reply = await _deepSeek.GetResponseAsync(
                request.SessionId,
                request.Message,
                context);

            // 4. 将交互记录保存到会话历史
            // - 保存用户消息（标记为用户发送）
            session.AddMessage(new ChatMessage(request.Message, IsUser: true));
            // - 保存AI回复（标记为非用户发送）
            session.AddMessage(new ChatMessage(reply, IsUser: false));
            // 5. 返回成功响应（包含AI回复）
            return Ok(new { Reply = reply });
        }
    }

    /// <summary>
    /// 聊天请求数据模型
    /// </summary>
    /// <param name="SessionId">会话唯一标识符</param>
    /// <param name="Message">用户发送的消息内容</param>
    public record ChatRequest(string SessionId, string Message);

}
